import java.util.*;
import java.util.function.Consumer;

/**
 * @author: Xzh
 * @date: 2023/3/3 9:28
 * @description:


 * 问题总结 : 必须把类型写好有点感觉不舒服
 */
public class gatherTest {
    public static void main(String[] args) {
        /**
         * map和list最大区别就是一个继承了map借口
         * 一个继承了collections借口，并且list里面实现了iterator借口所以可以便利
         * 然后map的增加是put,list的增加是add
         * list底层是数组 ，map底层是key,value 键值对
         *
         */
        //list最常用的创建方法
        gatherTest gatherTest = new gatherTest();
        List<Integer> list = gatherTest.newList();
        System.out.println(Arrays.toString(list.toArray()));
        //toArray就是将集合转换为数组其实list集合里面的构造方法就是要一个集合类
        //Arrays.toString就是将数组打印出来，以免打印地址
        List<Integer> list1 = gatherTest.CreateList();
        System.out.println(Arrays.toString(list1.toArray()));
      //  gatherTest.forList(list);
     //   gatherTest.forEList(list1);
     //   gatherTest.iterList(list);
     //   gatherTest.EList(list);
        //map最常用的创建方式
        Map<String, String> map = gatherTest.newMap();
        System.out.println(map);
        //map最常用的遍历方式
     //   gatherTest.esMap(map);
     //   gatherTest.iterMap(map);
        gatherTest.ksMap(map);
    }
    /**
     * list的普通创建
     */
    public List<Integer> newList(){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(5);
        list.add(8);
        list.add(9);
        list.add(33);
        return list;
    }
    /**
     * list工具类创建
     */
    public List<Integer> CreateList(){
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        return list;
    }
    /**
     * for循环遍历
     */
    public void forList(List list){
        for (int i = 0; i < list.size() ; i++) {
            System.out.println(list.get(i));
        }
    }
    /**
     * foreach遍历
     */
    public void forEList(List list){
        for (Object integer : list) {
            System.out.println(integer);
            //证明还是会强转
            System.out.println(integer.getClass().getTypeName());
        }
    }
    /**
     * iterator遍历器遍历 最主要原来就是hasnext判断下一个元素是否为空
     */
    public void iterList(List list){
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            //next不要用第二次容易一次取2个Returns the next element in the iteration.
            System.out.println(iterator.next());
        }

    }
    /**
     * 匿名内部类遍历
     */
    public void EList(List list){
        list.forEach(new Consumer() {
            @Override
            //虽然知道这里object可以接受所有,但是返回就不知道什么类型了
            public void accept(Object o) {
                System.out.println(o);
            }
        });
    }
    /**
     * 普通map创建
     */
    public Map<String, String> newMap(){
        //map是借口不能实例化 键不能相同 无序
        Map<String, String> map = new HashMap<>();
        map.put("龚自珍","书法家");
        map.put("李白","诗人");
        map.put("墨白","主播");
        return map;
    }
    /**
     *  map本身是没有继承遍历器接口的，但是他的entrySet方法使他变为一个set键值对，set里面继承了遍历器集合
     *  entrySet遍历
     */
    public void esMap(Map map){
        //entey里面有获取键值对必须知道是String类型
        Set<Map.Entry<String,String>> set = map.entrySet();
        for (Map.Entry<String, String> stringStringEntry : set) {
            System.out.println(stringStringEntry.getKey()+": "+stringStringEntry.getValue());
        }
    }
    /**
     *  遍历器遍历 必须把类型写好有点感觉不舒服
     */
    public void iterMap(Map<String,String> map){
        //entey里面有获取键值对必须知道是String类型
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            //先获取entry
            Map.Entry<String, String> next = iterator.next();
            System.out.println(next.getKey()+": "+next.getValue());
        }
    }
    /**
     * keySet所有键集合的获取
     */
    public void ksMap(Map<String,String> map){
        Set<String> strings = map.keySet();
        for (String string : strings) {
            System.out.println(string+": "+map.get(string));
        }
    }
}
